package com.pe.pgn.clubpgn.dao.impl;

import java.util.Calendar;
import java.util.List;

import javax.sql.DataSource;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Repository;

import com.pe.pgn.clubpgn.dao.DocumentoMovArticuloDetDao;
import com.pe.pgn.clubpgn.dao.hibernate.GenericDaoHibernate;
import com.pe.pgn.clubpgn.domain.ClpbDocumentoMovArticulo;
import com.pe.pgn.clubpgn.domain.ClpdArticulo;
import com.pe.pgn.clubpgn.domain.ClpdDocumentoMovArticulo;
import com.pe.pgn.clubpgn.domain.ClprPremioCatalogo;
import com.pe.pgn.clubpgn.domain.beans.BNArticulo;
import com.pe.pgn.clubpgn.domain.beans.BNAsignacionArticuloCatalogoDetalle;
import com.pe.pgn.clubpgn.domain.beans.BNDocumentoMovArticuloDet;


@Repository("documentoMovArticuloDetDao")
public class DocumentoMovArticuloDetDaoImpl
		extends GenericDaoHibernate<ClpdDocumentoMovArticulo, Long>
		implements DocumentoMovArticuloDetDao {

	@SuppressWarnings("unused")
	private JdbcTemplate jdbcTemplate;

	@Autowired
	public void setDataSource(DataSource dataSource) {
		this.jdbcTemplate = new JdbcTemplate(dataSource);
	}

	public DocumentoMovArticuloDetDaoImpl() {
		super(ClpdDocumentoMovArticulo.class);
	}
	
	@SuppressWarnings("unchecked")
	public List<BNDocumentoMovArticuloDet> obtenerDocumentoMovimientos(
			ClpbDocumentoMovArticulo documento) {
	  		
			if(documento.getCoAlmacenOrigen() == null || 
			"".equals(documento.getCoAlmacenOrigen())){
				documento.setCoAlmacenOrigen("-1");
			}
		
			StringBuffer query = new StringBuffer();
		  	query.append(" select ");
		  	query.append("  dcar.id as id , ");
		  	query.append("  dcar.co_documento_mov_articulo as coDocumentoMovArticulo, ");
		  	query.append("  dcar.co_articulo AS coArticulo, ");
		  	query.append("  dcar.va_cantidad as vaCantidad, ");
		  	query.append("  premio.va_canjes_limite as vaCanjesLimite, ");
		  	query.append("  dcar.co_premio as coPremio, ");
		  	query.append("  sac.va_cantidad as vaStockDisponible, ");
		  	query.append("  dcar.va_stock_disponible_asignado as vaStockDisponibleAsignado, ");
		  	query.append("  dcar.st_documento_mov_articulo as   stDocumentoMovArticulo, ");
		  	query.append("  dcar.co_serie as coSerie , ");
		  	query.append("  dcar.co_almacen_destino  as coAlamacenDestino, ");
		  	query.append("  dcar.co_catalogo_destino as coCatalogoDestino, ");
		  	query.append("  articulo.de_articulo as deArticulo, ");
		  	query.append("  unidad.de_unidad_medida as deUnidadMedida, "); 
		  	query.append("  premio.co_codigo_premio as coCodigoPremio ,");
		  	query.append("  articulo.co_codigo_articulo as coCodigoArticulo, ");	  	
		  	query.append(" 	articulo.st_maneja_stock_punto_canje	as stManejaStockPuntoCanje, ");
			query.append(" 	articulo.st_maneja_stock_alm_principal	as stManejaStockAlmPrincipal, ");
			query.append(" 	articulo.st_instantaneo_normal as stInstantaneoNormal,  "); 	
			query.append(" 	premio.va_stock_catalogo as vaStockCatalogo ");
			
		  	query.append("  from clpd_documento_mov_articulo dcar ");	  	  		
		  	query.append("	join clpd_articulo articulo on articulo.id = dcar.co_articulo ");	  	      
		  	query.append("	join clpr_premio_catalogo premio on premio.id = dcar.co_premio ") ;
		  	query.append("	join clpd_unidad_medida unidad on unidad.id = articulo.co_unidad_medida");	  	
		  	query.append("	join clpm_stock_almacen_catalogo sac on sac.co_articulo = articulo.id ") ;
		  	      
		  	query.append("  where 1 = 1 ");	  		
		  	query.append("	and dcar.co_documento_mov_articulo = ").append(documento.getId());
		  	query.append("	and sac.co_catalogo is null ") ;
		  	query.append("	and sac.co_almacen = ").append(documento.getCoAlmacenOrigen());
			
			System.out.println("*** DocumentoMovArticuloDetDaoImpl.obtenerDocumentoMovimientos() --> "+query.toString());
			return findListOfBeans(query.toString(), null, BNDocumentoMovArticuloDet.class);
		}

	public int guardarDocumentos(ClpbDocumentoMovArticulo documento,
			BNAsignacionArticuloCatalogoDetalle detalle, ClpdArticulo articulo,
			ClprPremioCatalogo premio) {
				
				ClpdDocumentoMovArticulo documentoMov = new ClpdDocumentoMovArticulo();
				documentoMov.setClpdArticulo(articulo);
				documentoMov.setClprPremio(premio);
				documentoMov.setClpbDocumento(documento);
				
				documentoMov.setStDocumentoMovArticulo(Boolean.TRUE);
				documentoMov.setCoAlmacenDestino(documento.getClpbAlmacenDestino().getId());
				//documentoMov.setVaStockDisponibleAsignado(detalle.getStockDisponibleAsignado());
				documentoMov.setCoCatalogoDestino(documento.getClpmCatalogo().getId());
				documentoMov.setCoAlmacenDestino(documento.getClpbAlmacenDestino().getId());
				documentoMov.setStDocumentoMovArticulo(Boolean.TRUE);
				
				
				if(documentoMov.getId() == null){
					documentoMov.setCoUsuarioCreador(getUsuarioLogueado().getUsername());
					documentoMov.setDaFechaCreacion(Calendar.getInstance());
				}
				else{
					documentoMov.setCoUsuarioModificador(getUsuarioLogueado().getUsername());
					documentoMov.setDaFechaModificacion(Calendar.getInstance());
				}
				
				getHibernateTemplate().saveOrUpdate(documentoMov);	
				
		return 1;
	}


	public void eliminarMovimiento(Long id) {
		ClpdDocumentoMovArticulo documento = getHibernateTemplate().get(
				ClpdDocumentoMovArticulo.class, id);

		documento.setStDocumentoMovArticulo(Boolean.FALSE);
		getHibernateTemplate().update(documento);
		
	}


	public ClpdDocumentoMovArticulo obtenerMovimiento(Long id) {
		ClpdDocumentoMovArticulo documento = get(id);
		System.out.println("EL CODIGO DEL movimiento es ES:" + documento.getId());
		return documento;
		}


	@SuppressWarnings("unchecked")
	public List<BNArticulo> obtenerArticulosDocumento(Long idDoccumento) {
		
		// Lista de Articulos devueltos por documento
		StringBuffer query = new StringBuffer();		
	  	query.append(" select ");
	  	query.append("  dcar.id as id , ");
	  	query.append("  dcar.va_cantidad as vaCantidad, ");
	  	query.append("  articulo.de_articulo as deArticulo, ");
	  	query.append("  unidad.de_unidad_medida as deUnidadMedida, "); 
	  	query.append("  articulo.co_codigo_articulo as coCodigoArticulo ");
	  	
	  	query.append("  from clpd_documento_mov_articulo dcar ");	  	  		
	  	query.append("	join clpd_articulo articulo ");
	  	query.append("  on articulo.id = dcar.co_articulo ");	  	      
	  	query.append("	join clpd_unidad_medida unidad ");
	  	query.append("  on unidad.id = articulo.co_unidad_medida");
	  	      	  	      
	  	query.append("  where 1 = 1 ");	  		
	  	query.append("  and dcar.co_documento_mov_articulo = ").append(idDoccumento);
			
		System.out.println("*** DocumentoMovArticuloDetDaoImpl.obtenerArticulosDocumento() --> "+query.toString());
		return findListOfBeans(query.toString(), null, BNArticulo.class);
	}
}
